import random
import time

# 存储用户数据：key=卡号，value=字典（姓名、身份证号、手机号、密码、余额、锁定状态）
user_database = {}
# 管理员账号密码（固定，可扩展为配置文件）
ADMIN_ACCOUNT = "admin"
ADMIN_PASSWORD = "admin123"


def generate_unique_card_id():
    """生成唯一的6位数字卡号"""
    while True:
        card_id = str(random.randint(100000, 999999))
        if card_id not in user_database:
            return card_id


def verify_card_password(card_id):
    """验证卡号和密码，连续3次错误则锁定卡号，返回是否验证成功"""
    if card_id not in user_database:
        print("❌ 卡号不存在！")
        return False

    user = user_database[card_id]
    if user["is_locked"]:
        print("❌ 该卡号已被锁定，请先解锁！")
        return False

    for attempt in range(3):
        password = input("请输入密码：").strip()
        if password == user["password"]:
            return True
        remaining = 2 - attempt
        if remaining > 0:
            print(f"❌ 密码错误！剩余尝试次数：{remaining}")
        else:
            user["is_locked"] = True
            print("❌ 连续3次密码错误，卡号已被锁定！")
    return False


def open_account():
    """开户功能"""
    print("\n===== 开户操作 =====")
    name = input("请输入姓名：").strip()
    id_card = input("请输入身份证号：").strip()
    phone = input("请输入手机号：").strip()

    # 验证预存金额合法性
    while True:
        try:
            pre_deposit = float(input("请输入预存金额（≥0）：").strip())
            if pre_deposit >= 0:
                break
            print("❌ 预存金额不能为负数，请重新输入！")
        except ValueError:
            print("❌ 输入错误，请输入数字！")

    # 密码设置（简单验证长度）
    while True:
        password = input("请设置密码（6位数字）：").strip()
        if len(password) == 6 and password.isdigit():
            confirm_pwd = input("请确认密码：").strip()
            if confirm_pwd == password:
                break
            print("❌ 两次密码不一致，请重新设置！")
        else:
            print("❌ 密码必须是6位数字，请重新设置！")

    # 生成卡号并保存数据
    card_id = generate_unique_card_id()
    user_database[card_id] = {
        "name": name,
        "id_card": id_card,
        "phone": phone,
        "password": password,
        "balance": pre_deposit,
        "is_locked": False
    }

    print("\n✅ 开户成功！")
    print(f"您的卡号：{card_id}")
    print(f"账户余额：{pre_deposit:.2f}元")
    print("请妥善保管您的卡号和密码！")


def query_balance():
    """查询余额功能"""
    print("\n===== 查询余额 =====")
    card_id = input("请输入卡号：").strip()

    # 验证卡号和密码
    if not verify_card_password(card_id):
        return

    # 展示余额
    user = user_database[card_id]
    print(f"\n📊 账户信息：")
    print(f"姓名：{user['name']}")
    print(f"卡号：{card_id}")
    print(f"当前余额：{user['balance']:.2f}元")


def withdraw_money():
    """取款功能"""
    print("\n===== 取款操作 =====")
    card_id = input("请输入卡号：").strip()

    # 验证卡号和密码
    if not verify_card_password(card_id):
        return

    user = user_database[card_id]
    print(f"\n当前余额：{user['balance']:.2f}元")

    # 验证取款金额合法性
    while True:
        try:
            amount = float(input("请输入取款金额：").strip())
            if amount > user["balance"]:
                print(f"❌ 取款金额大于账户余额（当前余额：{user['balance']:.2f}元），请重新输入！")
            elif amount < 0:
                print("❌ 取款金额不能为负数，请重新输入！")
            else:
                break
        except ValueError:
            print("❌ 输入错误，请输入数字！")

    # 执行取款
    user["balance"] -= amount
    print(f"\n✅ 取款成功！")
    print(f"取款金额：{amount:.2f}元")
    print(f"剩余余额：{user['balance']:.2f}元")


def deposit_money():
    """存款功能"""
    print("\n===== 存款操作 =====")
    card_id = input("请输入卡号：").strip()

    # 验证卡号和密码
    if not verify_card_password(card_id):
        return

    user = user_database[card_id]
    print(f"\n当前余额：{user['balance']:.2f}元")

    # 验证存款金额合法性
    while True:
        try:
            amount = float(input("请输入存款金额：").strip())
            if amount >= 0:
                break
            print("❌ 存款金额不能为负数，请重新输入！")
        except ValueError:
            print("❌ 输入错误，请输入数字！")

    # 执行存款
    user["balance"] += amount
    print(f"\n✅ 存款成功！")
    print(f"存款金额：{amount:.2f}元")
    print(f"当前余额：{user['balance']:.2f}元")


def transfer_money():
    """转账功能"""
    print("\n===== 转账操作 =====")
    from_card = input("请输入转出卡号：").strip()

    # 验证转出卡合法性和密码
    if from_card not in user_database:
        print("❌ 转出卡号不存在！")
        return

    from_user = user_database[from_card]
    if from_user["is_locked"]:
        print("❌ 转出卡号已被锁定，无法转账！")
        return

    if not verify_card_password(from_card):
        return

    # 验证转入卡号
    to_card = input("请输入转入卡号：").strip()
    if to_card not in user_database:
        print("❌ 转入卡号不存在！")
        return
    if to_card == from_card:
        print("❌ 不能向自己的卡号转账！")
        return

    to_user = user_database[to_card]
    print(f"\n转出账户：{from_user['name']}（卡号：{from_card}）")
    print(f"转入账户：{to_user['name']}（卡号：{to_card}）")
    print(f"转出账户当前余额：{from_user['balance']:.2f}元")

    # 验证转账金额
    while True:
        try:
            amount = float(input("请输入转账金额：").strip())
            if amount > from_user["balance"]:
                print(f"❌ 转账金额大于账户余额（当前余额：{from_user['balance']:.2f}元），请重新输入！")
            elif amount < 0:
                print("❌ 转账金额不能为负数，请重新输入！")
            else:
                break
        except ValueError:
            print("❌ 输入错误，请输入数字！")

    # 确认转账
    confirm = input(f"\n确认向 {to_user['name']}（{to_card}）转账 {amount:.2f}元？（y/n）：").strip().lower()
    if confirm == "y":
        # 执行转账
        from_user["balance"] -= amount
        to_user["balance"] += amount
        print("\n✅ 转账成功！")
        print(f"转出后余额：{from_user['balance']:.2f}元")
    else:
        print("\n❌ 转账已取消！")


def lock_card():
    """锁定卡号功能"""
    print("\n===== 锁定卡号 =====")
    card_id = input("请输入要锁定的卡号：").strip()

    if card_id not in user_database:
        print("❌ 卡号不存在！")
        return

    user = user_database[card_id]
    if user["is_locked"]:
        print("❌ 该卡号已处于锁定状态！")
        return

    # 验证密码
    if verify_card_password(card_id):
        user["is_locked"] = True
        print("\n✅ 卡号锁定成功！")
        print("提示：锁定后无法进行查询、取款、存款、转账操作，请解锁后使用。")


def unlock_card():
    """解锁卡号功能"""
    print("\n===== 解锁卡号 =====")
    card_id = input("请输入要解锁的卡号：").strip()

    if card_id not in user_database:
        print("❌ 卡号不存在！")
        return

    user = user_database[card_id]
    if not user["is_locked"]:
        print("❌ 该卡号未被锁定，无需解锁！")
        return

    # 验证密码
    if verify_card_password(card_id):
        user["is_locked"] = False
        print("\n✅ 卡号解锁成功！")
        print("提示：解锁后可恢复所有账户操作权限。")


def exit_system():
    """退出系统功能（需管理员验证）"""
    print("\n===== 退出系统 =====")
    account = input("请输入管理员账号：").strip()
    password = input("请输入管理员密码：").strip()

    if account == ADMIN_ACCOUNT and password == ADMIN_PASSWORD:
        print("\n✅ 验证通过，正在退出系统...")
        time.sleep(1)
        print("👋 系统已退出，感谢使用！")
        return True  # 标记退出成功
    else:
        print("\n❌ 管理员账号或密码错误，返回功能菜单！")
        time.sleep(1)
        return False  # 标记退出失败


def show_main_menu():
    """显示主功能菜单"""
    while True:
        print("\n" + "=" * 40)
        print("          🏦 银行管理系统 v1.0")
        print("=" * 40)
        print("  1. 开户    2. 查询余额    3. 取款    4. 存款")
        print("  5. 转账    6. 锁定卡号    7. 解锁卡号 8. 退出系统")
        print("=" * 40)

        choice = input("请选择功能（输入数字1-8）：").strip()
        if choice == "1":
            open_account()
        elif choice == "2":
            query_balance()
        elif choice == "3":
            withdraw_money()
        elif choice == "4":
            deposit_money()
        elif choice == "5":
            transfer_money()
        elif choice == "6":
            lock_card()
        elif choice == "7":
            unlock_card()
        elif choice == "8":
            if exit_system():
                break  # 退出主循环
        else:
            print("❌ 输入错误，请选择1-8之间的数字！")

        # 操作完成后暂停，方便用户查看结果
        input("\n按回车键返回主菜单...")


if __name__ == "__main__":
    show_main_menu()